import { EggAppConfig, EggAppInfo, PowerPartial } from "egg";

export default (appInfo: EggAppInfo): PowerPartial<EggAppConfig> => {
  const config = {} as PowerPartial<EggAppConfig>;

  // 应用基础配置
  config.keys = appInfo.name + "_1703658000000_1234";

  // 中间件配置
  config.middleware = ["logger"];

  // 安全配置
  config.security = {
    csrf: {
      enable: false
    }
  };

  // CORS配置（为Socket.io准备）
  config.cors = {
    origin: "*",
    credentials: true
  };

  // MySQL数据库配置
  config.mysql = {
    // 单数据库信息配置
    client: {
      // 数据库连接主机地址
      host: "localhost",
      // 数据库连接端口
      port: "3306",
      // 用户名
      user: "root",
      // 密码（请根据实际情况修改）
      password: "12345678", // MySQL密码
      // 数据库名
      database: "sso_system"
      // 字符集（MySQL2配置）
      // charset: 'utf8mb4', // 注释掉，使用默认配置
      // 连接池配置（注释掉不支持的选项）
      // connectionLimit: 10,
      // 连接超时时间
      // acquireTimeout: 60000,
      // 空闲连接超时时间
      // timeout: 60000,
    },
    // 是否加载到 app 上，默认开启
    app: true,
    // 是否加载到 agent 上，默认关闭
    agent: false
  };

  // Session配置：基于Cookie + Session的强控制模式
  config.session = {
    // 使用Egg内建session，独立于我们自定义的SSO_SESSION_ID
    key: "EGG_SESS",
    // Session的最大过期时间（24小时）
    maxAge: 24 * 3600 * 1000,
    // 是否在每次请求时更新Session过期时间
    renew: true,
    // 是否只在HTTPS下传输（生产环境建议设为true）
    secure: false,
    // 是否禁止JavaScript访问Cookie（防XSS攻击）
    httpOnly: true,
    // Cookie的SameSite策略（防CSRF攻击）
    sameSite: "lax",
    // Cookie的作用域路径
    path: "/",
    // Cookie的作用域名（留空表示当前域名）
    domain: "",
    // Session签名密钥（生产环境请使用强密钥）
    signed: true
  };

  // 集群配置
  config.cluster = {
    listen: {
      port: 7001,
      hostname: "0.0.0.0"
    }
  };

  // 禁用性能监控文件生成
  config.timing = {
    enable: false
  };

  // 日志配置 - 详细记录所有操作
  config.logger = {
    level: "INFO", // 文件日志记录INFO及以上级别
    consoleLevel: "INFO", // 控制台显示INFO及以上
    // 性能优化配置
    allowDebugAtProd: false,
    // 输出格式配置
    outputJSON: true, // 使用JSON格式便于日志分析
    buffer: true // 启用缓冲提升性能
  };

  // 自定义日志配置
  (config as any).customLogger = {
    ssoLogger: {
      file: "logs/sso.log", // SSO操作日志
      level: "INFO",
      formatter(meta: any) {
        return `[${meta?.date}] [SSO] [${meta?.level}] ${meta?.message}`;
      }
    },
    securityLogger: {
      file: "logs/security.log", // 安全相关日志
      level: "WARN",
      formatter(meta: any) {
        return `[${meta?.date}] [SECURITY] [${meta?.level}] ${meta?.message}`;
      }
    }
  };

  return {
    ...config
  };
};
